#include "app_pool.h"
#include <stdlib.h>
#include <mqueue.h>
#include <pthread.h>
#include "log/log.h"

static char *mq_name = "/mq_pool"; // 消息队列的路径，在/dev/mqueue目录下
static pthread_t *thread_pool;     // 线程池
static mqd_t mq;                   // 消息队列的描述符
static int thread_count;           // 线程数量

// 线程函数
void *thread_fun(void *arg)
{
    Task task;
    while (1)
    {
        // 取任务，执行任务
        int len = mq_receive(mq, (char *)&task, sizeof(Task), NULL);
        if (len == sizeof(Task))
        {
            task.task_fun(task.arg);
        }
    }
    return NULL;
}

int app_pool_init(int thread_num)
{
    // 创建打开消息队列
    struct mq_attr attr;
    attr.mq_maxmsg = 10;            // 最大消息数
    attr.mq_msgsize = sizeof(Task); // 每个消息的最大字节数
    mq = mq_open(mq_name, O_CREAT | O_RDWR, 0666, &attr);
    if (mq == (mqd_t)-1)
    {
        log_error("mq_open error");
        return -1;
    }

    // 创建线程池
    static int thread_count; // 线程数量
    thread_pool = malloc(sizeof(pthread_t) * thread_num);
    for (int i = 0; i < thread_num; i++)
    {
        pthread_create(thread_pool + i, NULL, thread_fun, NULL);
    }

    return 0;
}

int app_pool_destroy(void)
{
    // 关闭删除消息队列
    mq_close(mq);
    mq_unlink(mq_name);

    // 取消停止所有线程
    for (int i = 0; i < thread_count; i++)
    {
        pthread_cancel(thread_pool[i]);
        pthread_join(thread_pool[i], NULL);
    }
    free(thread_pool); // 释放线程池内存
    return 0;
}

int app_pool_registerTask(int (*task_fun)(void *arg), void *arg)
{
    // 创建任务对象
    Task task = {
        .task_fun = task_fun,
        .arg = arg};

    // 发送任务到消息队列
    return mq_send(mq, (const char *)&task, sizeof(Task), 1);
}